package StructurePattern.Adapter;

/**
 * @author: Themberfue
 * @date: 2025/8/12 10:51
 * @description:
 */
// 1. 目标接口（客户端期望的接口）
interface MediaPlayer {
    void play(String audioType, String fileName);
}

// 2. 高级目标接口（扩展接口）
interface AdvancedMediaPlayer {
    void playMp4(String fileName);
    void playVlc(String fileName);
}

// 3. 适配者1（需要被适配的类）
class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        // 不支持MP4格式
    }

    @Override
    public void playVlc(String fileName) {
        System.out.println("播放VLC文件: " + fileName + ".vlc");
    }
}

// 4. 适配者2（需要被适配的类）
class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        System.out.println("播放MP4文件: " + fileName + ".mp4");
    }

    @Override
    public void playVlc(String fileName) {
        // 不支持VLC格式
    }
}

// 5. 适配器类（将高级播放器适配到基础播放器接口）
class MediaAdapter implements MediaPlayer {
    // 组合适配者对象
    private AdvancedMediaPlayer advancedMusicPlayer;

    // 根据文件类型创建对应的适配者
    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }

    // 实现目标接口，转换请求
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

// 6. 客户端使用的类（只依赖目标接口）
class AudioPlayer implements MediaPlayer {
    private MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        // 支持原生格式
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("播放MP3文件: " + fileName + ".mp3");
        }
        // 不支持的格式使用适配器
        else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }
        // 不支持的格式
        else {
            System.out.println("不支持的格式: " + audioType);
        }
    }
}

// 7. 客户端代码
public class AdapterExample {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3", "童年");       // 原生支持
        audioPlayer.play("mp4", "旅行");       // 通过适配器支持
        audioPlayer.play("vlc", "纪录片");     // 通过适配器支持
        audioPlayer.play("avi", "动作片");     // 不支持的格式
    }
}

